# -*- coding:utf-8 -*-
import numpy as np
from sklearn import svm

from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']

#加载数据
data=np.loadtxt('data/xigua.txt',delimiter=',');print(data)
#
# #提取数据
X,y=np.split(data,[2,],axis=1); #axis=1表示横向拆分,默认是纵向拆分
#
# #对数据洗牌
np.random.seed(0)
m=len(X)
order=np.random.permutation(m)
X=X[order]
y=y[order]
# #
# #将数据分割成训练集和测试集
d=int(0.6*m)
train_X,test_X=np.split(X,[d]);print(train_X)
train_y,test_y=np.split(y,[d])
# #
# #调用SVM库函数实现分类
clf=svm.SVC(C=0.1,kernel='rbf',decision_function_shape='ovr') #rbf高斯核函数
clf.fit(train_X,train_y.ravel())   #调用fit函数进行训练
# #
print('测试集的分类结果=',clf.predict(test_X))  #测试集的分类结果
print('支持向量下标索引=',clf.support_)         #支持向量下标索引
print('支持向量列表=',clf.support_vectors_)  #支持向量列表
print('支持向量所属的每个类别个数=',clf.n_support_)       #支持向量所属的每个类别个数
print('训练集样本距离超平面距离=',clf.decision_function(train_X))  #训练集样本距离超平面距离
print('训练集的准确率=',clf.score(train_X,train_y))  #训练集的准确率
print('测试集准确率=',clf.score(test_X,test_y))    #测试集准确率
#
# #画整个样本数据
plt.figure('SVM')
plt.scatter(X[:,0],X[:,1],c=y.ravel(),cmap=plt.cm.Paired,edgecolors='k',s=20,zorder=10)
# #画出测试数据
plt.scatter(test_X[:,0],test_X[:,1],facecolors='none',edgecolors='k',s=80,zorder=10)
# #计算数据的坐标边界值
min_x,max_x,min_y,max_y=min(X[:,0]),max(X[:,0]),min(X[:,1]),max(X[:,1])
#生成网格化坐标数据
XX,YY=mgrid[min_x:max_x:200j,min_y:max_y:200j]
# #计算网格化坐标数据到超平面距离
Z=clf.decision_function(np.c_[XX.ravel(),YY.ravel()])
# # #将距离转换成和XX一样的纬度
Z=Z.reshape(XX.shape)
# # #画网格化数据的颜色
plt.contourf(XX,YY,Z>0,cmap=plt.cm.Paired)
# # #画分界线
plt.contour(XX,YY,Z,colors=['r','k','g'],linestyles=['--','-','--'],levels=[-0.002,0,0.002])
#
plt.show()